package com.igeek.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.UnsupportedEncodingException;
import java.util.Map;

/**
 * 1 实现httpservletrequest接口——通过继承HttpServletRequestWrapper(MyRquest是httpservletrequest子类)
 * 2 设置一个变量，用来保存服务器创建的request对象
 * 3 处理乱码，就是改写获取请求参数的三个方法
 */
public class MyRquest extends HttpServletRequestWrapper {
    private HttpServletRequest request;
    public MyRquest(HttpServletRequest request) {
        super(request);
        this.request=request;
    }

    /**
     * 获取参数的键值对
     * @return
     */
    @Override
    public Map<String, String[]> getParameterMap() {
        //获取请求方式
        String method=request.getMethod();
        if(method.equalsIgnoreCase("post")){
            try {
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return super.getParameterMap();
            }
        }else if(method.equalsIgnoreCase("get")){
            //获取所有的键值对参数
            Map<String,String[]> map=request.getParameterMap();
            //如果参数不为null
            try {
                if(map!=null){
                    //遍历该集合中所有的键值对参数
                    for(String key:map.keySet()){
                        //得到该key对应values
                        String [] values=map.get(key);
                        if(values!=null){
                            for(int i=0;i<values.length;i++){
                                if(values[i]!=null && !values[i].equals("")){
                                    //遍历所有的值,一个一个地去处理中文乱码
                                    String newVal=new String(values[i].getBytes("iso-8859-1"),"utf-8");
                                    //把后生成的不乱码的中文重新赋值给当前的参数值
                                    values[i]=newVal;
                                }
                            }
                        }
                    }
                    return map;
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return super.getParameterMap();
            }
        }
        //如果不是上面的两种请求方式
        return super.getParameterMap();
    }

    @Override
    public String[] getParameterValues(String name) {
        //是从上面那个方法获取所有的键值对
        Map<String,String[]> map=this.getParameterMap();
        if(map!=null){
            String [] values=map.get(name);
            return values;
        }
        return super.getParameterValues(name);
    }

    @Override
    public String getParameter(String name) {
        String [] values=this.getParameterValues(name);
        if(values!=null){
            return values[0];
        }
        return super.getParameter(name);
    }


}
